/*ident	"@(#)G2++:g2++lib/geng2mach.c	3.4" */
/******************************************************************************
*
* C++ Standard Components, Release 3.0.
*
* Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc.
* Copyright (c) 1988, 1989, 1990 AT&T.  All Rights Reserved.
*
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System
* Laboratories, Inc.  The copyright notice above does not evidence
* any actual or intended publication of such source code.
*
******************************************************************************/

//  This program computes the size and alignment constants 
//  for the G2 compiler for a given machine/compiler 
//  combination.
//
//  It generates the file "g2mach.h".

#include <osfcn.h>
#include <stdlib.h>
#include <stdio.h>
#include <String.h>
#ifdef __GNUG__
#pragma implementation "Vblock.h"
#pragma implementation "Block.h"
#endif
#include "Vblock.h"
#ifdef __GNUG__
template class Vblock<char>;
#endif

#ifdef LSC
#define main _main
#endif

static 
struct xchar {
    char base[1];
    char x;
}xchar;

static
struct xshort {
    char base[1];
    short x;
}xshort;

static
struct xlong {
    char base[1];
    long x;
}xlong;

static
struct xstring {
    char base[1];
    String x;
}xstring;

static
struct xvblock {
    char base[1];
    Vblock<char> x;
} xvblock;

/*static*/
struct xstruct {
    char base;
}/*xstruct*/;

char* g2progname_ATTLC = "aligncomp";
char* g2filename_ATTLC = "g2mach.h";

main(){
    FILE* f;
    
    if( 
	(f=fopen(g2filename_ATTLC, "w")) == NULL 
    ){
	fprintf(stderr, "cannot open '%s'\n", g2filename_ATTLC);
	exit(1);
    }
    fprintf(f, "/*ident	\"@(#)G2++:incl/g2mach.h	3.0\"  */\n");

    fprintf(f, "/******************************************************************************\n");
    fprintf(f, "*\n");
    fprintf(f, "* C++ Standard Components, Release 3.0.\n");
    fprintf(f, "*\n");
    fprintf(f, "* Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc.\n");
    fprintf(f, "* Copyright (c) 1988, 1989, 1990 AT&T.  All Rights Reserved.\n");
    fprintf(f, "*\n");
    fprintf(f, "* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System\n");
    fprintf(f, "* Laboratories, Inc.  The copyright notice above does not evidence\n");
    fprintf(f, "* any actual or intended publication of such source code.\n");
    fprintf(f, "*\n");
    fprintf(f, "******************************************************************************/\n\n");
    fprintf(f, "//\n");
    fprintf(f, "// G2 machine-dependent parameters\n");
    fprintf(f, "// (this file is generated by the program geng2mach;\n");
    fprintf(f, "// it should NOT be on a distribution tape)\n");
    fprintf(f, "//\n");

//  Protection against multiple inclusion

    fprintf(
	f,
	"#ifndef G2MACHH\n#define G2MACHH\n\n"
    );

//  Sizes

    fprintf(
	f, 
	"const int CHAR_SIZE_ATTLC=%d;\n", 
	sizeof(char)
    );
    fprintf(
	f, 
	"const int SHORT_SIZE_ATTLC=%d;\n", 
	sizeof(short)
    );
    fprintf(
	f, 
	"const int LONG_SIZE_ATTLC=%d;\n", 
	sizeof(long)
    );
    fprintf(
	f, 
	"const int STRING_SIZE_ATTLC=%d;\n", 
	sizeof(String)
    );
    fprintf(
	f, 
	"const int VBLOCK_SIZE_ATTLC=%d;\n", 
	sizeof(Vblock<char>)
    );

//  Alignments

    fprintf(
	f,
	"\n"
    );
    fprintf(
	f, 
	"const int CHAR_ALIGN_ATTLC=%d;\n", 
	(char*)&xchar.x - xchar.base
    );
    fprintf(
	f, 
	"const int SHORT_ALIGN_ATTLC=%d;\n", 
	(char*)&xshort.x - xshort.base
    );
    fprintf(
	f, 
	"const int LONG_ALIGN_ATTLC=%d;\n", 
	(char*)&xlong.x - xlong.base
    );
    fprintf(
	f, 
	"const int STRING_ALIGN_ATTLC=%d;\n", 
	(char*)&xstring.x - xstring.base
    );
    fprintf(
	f, 
	"const int VBLOCK_ALIGN_ATTLC=%d;\n", 
	(char*)&xvblock.x - xvblock.base
    );
    fprintf(
	f, 
	"const int STRUCT_ALIGN_ATTLC=%d;\n", 
	sizeof(xstruct)
    );

//  Protection against multiple inclusion

    fprintf(
	f,
	"\n#endif\n"
    );

    exit(0);
}
